﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace ViewRidgeAssistant
{
    public partial class work_form : Form
    {
        private main _parent_main;
        private form_artist _parent_artist;
        private data_source _data_module;

        private class_work _work;
        private class_artist _artist;

        private int _artist_id;

        private string _parent_form;

        private string _id;

        private string _state;

        public string _call_obj;

        public string last_text;
        
        //вызов из главной формы для добавления картины
        public work_form(main parent, data_source data_module)
        {
            InitializeComponent();
            this._parent_main = parent;
            this._data_module = data_module;
            this.set_state("NEW");                  //Форма в режиме ввода новой картины
            //update_work_state_on_form();
            this.fill_artist_name_combobox();
        }

        //Конструктор, вызываемый при редактировании картины
        public work_form(main parent, data_source data_module, int work_id)
        {
            InitializeComponent();
            this._id = work_id.ToString();
            this._parent_main = parent;
            this._data_module = data_module;
            this.fill_work_data();
            this.set_state("OLD");          //Форма находится в режиме просмотра сущ. записи
            update_work_state_on_form();
            //this.fill_start_data();
            this.fill_artist_name_combobox();
        }

        //Конструктор, вызываемый при добавлении новой картины из формы художника
        public work_form(form_artist parent, data_source data_module, int artist_id, class_work work)
        {
            InitializeComponent();
            this._parent_artist = parent;
            this._data_module = data_module;
            this._work = work;
            this._artist_id = artist_id;
            fill_start_data();
            this._call_obj = "artist_form";
            this.combo_name.Enabled = false;
            this.set_state("NEW");
            update_work_state_on_form();
        }

        public void fill_start_data()
        {
            //class_artist artist;
            //MessageBox.Show(this._artist_id.ToString());
            this._artist = this._data_module.get_artist(this._artist_id);
            if (this._artist.result == "OK")
            {
                this.combo_name.Text = this._artist.artist_name;
            }
            else
            {
                MessageBox.Show(this._artist.result);
                this.Dispose();
            }
        }

        public void fill_res_data()
        {
            this._work.title = this.t_title.Text;
        }

        public void set_state(string state)
        {
            switch (state)
            {
                case "OLD":
                    this._state = "OLD";
                    this.Text = "Картина - Просмотр";
                    this.l_status.Text = "";
                    this.b_save.Enabled = false;
                    this.b_delete.Enabled = true;
                    break;

                case "NEW":
                    this._state = "NEW";
                    this.Text = "Картина - Добавление";
                    this.b_save.Enabled = false;
                    this.b_delete.Enabled = false;
                    this.b_sale.Enabled = false;
                    this.b_buy.Enabled = false;
                    break;

                case "MOD":
                    this._state = "MOD";
                    this.Text = "Картина - Редактирование";
                    this.b_save.Enabled = true;

                    break;
            }
        }

        public void fill_work_data()
        {
            class_work work;
            work = this._data_module.get_work(Convert.ToInt32(this._id));
            if (work.result == "OK")
            {
                this._work = work;

                this.t_title.Text = work.title;
                this.t_copy.Text = work.copy;
                this.t_desc.Text = work.desc;

                class_artist artist;
                artist = this._data_module.get_artist(Convert.ToInt32(work.artist_id));
                this._artist = artist;

                if (artist.result == "OK")
                {
                    this.combo_name.Text = artist.artist_name;
                }
                else
                {
                    MessageBox.Show("Ошибка при получении данных о художнике!");
                    MessageBox.Show(artist.result);
                    this._parent_main.Enabled = true;
                    this.Dispose();
                }
            }
            else
            {
                //Не удалось получить сведений о работе
                MessageBox.Show("Не удалось получить информацию о картине: " + work.result);
                this.Dispose();
            }
        }

        private void fill_artist_name_combobox()
        {
            ArrayList artists;
            artists = this._data_module.get_list_by_table_and_column("ARTIST", "Name");
            if (artists != null)
            {
                this.combo_name.Items.Clear();
                foreach (String artist in artists)
                    this.combo_name.Items.Add(artist);
            }
            else
            {
                MessageBox.Show("Не удалось получить список художников");
                this.Dispose();
            }
        }

        private void b_save_Click(object sender, EventArgs e)
        {
            if ((this.t_title.Text == "") || (this.combo_name.Text == "")) 
            {
                MessageBox.Show("Не заполнены обязательные поля!");
                return;
            }
            string result = "";              //Результат попытки сохранения/добавления клиента

            this.l_status.Text = "Получение кода художника...";
            String temp_artist_id = this._data_module.get_field_for_object("ARTIST", "ArtistID", "Name", this.combo_name.Text.ToString());
            if (temp_artist_id != null)
            {
                this._artist_id = Convert.ToInt32(temp_artist_id);
                switch (this._state)
                {
                    //Если добавляется новая запись...
                    case "NEW":
                        this.l_status.Text = "Добавление новой картины...";
                        result = this._data_module.add_work(this._artist_id, this.t_title.Text,
                                                                    this.t_copy.Text, this.t_desc.Text);
                        if (this._call_obj == "artist_form") fill_res_data();
                        break;

                    //Если модифицируется существующая...
                    case "MOD":
                        this.l_status.Text = "Модификация данных о картине... ";
                        this._artist.artist_id = this._artist_id.ToString();
                        result = this._data_module.upd_work(Convert.ToInt32(this._id), Convert.ToInt32(this._artist.artist_id),
                                                                    this.t_title.Text, this.t_copy.Text, this.t_desc.Text);

                        break;
                }
            }
            else
            {
                result = "ERROR_IN_ARTIST_DATA";
                MessageBox.Show("Ошибка в данных художника!\nПроверьте корректность имени художника.");
                return;
            }

            if (result == "OK")
            {
                if (this._state == "NEW")
                {
                    this.l_status.Text = "Получение ID новой картины...";
                    string new_work_id = this._data_module.get_last_identity();
                    if (!(new_work_id == "NULL"))
                    {
                        this.l_status.Text = "Создание транзакции...";
                        result = "OK";
                        if (result == "OK")
                        {
                            this.set_state("OLD");
                            String trans_id = this._data_module.get_last_identity();
                            form_transaction transaction = new form_transaction(this._data_module, Convert.ToInt32(trans_id));
                            transaction.ShowDialog();
                            this.Dispose();
                        }
                        else
                        {
                            MessageBox.Show("Ошибка при создании транзакции по-умолчанию");
                        }
                    }
                    else
                    {
                        MessageBox.Show("Ошибка при получении ID новой картины");
                    }
                }
                else
                    if (this._state == "MOD")
                    {
                        this.set_state("OLD");
                        this.l_status.Text = "Изменение записи успешно завершено";
                    }
            }
            else
            {
                this.l_status.Text = "Ошибка";
                MessageBox.Show(result);
            }
        }

        private void form_work_closed(object sender, FormClosedEventArgs e)
        {
            this.Dispose();
        }

        private void enabled_b_save(object sender, EventArgs e)
        {
            //this.b_delete.Enabled = false;
            this.l_status.Text = "Запись изменена";
            this.b_save.Enabled = true;
            if (this._state == "OLD") { this.set_state("MOD"); };
        }

        private void b_delete_Click(object sender, EventArgs e)
        {
            this.l_status.Text = "Удаление записи...";
            string result = this._data_module.del_record_by_id("WORK", Convert.ToInt32(this._id));
            if (result == "OK")
            {
                this.l_status.Text = "Запись успешно удалена";
                this._parent_main.Enabled = true;
                this.Dispose();
            }
            else
            {
                this.l_status.Text = "Ошибка";
                MessageBox.Show(result);
            }
        }

        private void update_work_state_on_form()
        {
            this.b_sale.Enabled = true;
            this.b_buy.Enabled = false;
            string result;
            result = this._data_module.get_work_state(Convert.ToInt32(this._id));
            if (result == "NOT_IN_GALLERY")
            {
                this.b_sale.Enabled = false;
                this.b_buy.Enabled = true;
            }
            if (result == "ERROR")
            {
                MessageBox.Show("Ошибка получение данных о наличии картины в галерее");
                this.Dispose();
            }
        }

        private void b_sale_Click(object sender, EventArgs e)
        {
            this._work = this._data_module.get_work(Convert.ToInt32(this._id));
            form_transaction transaction = new form_transaction(this._data_module, this._work, "purchase");
            transaction.ShowDialog();
            //transaction.Dispose();
            this.update_work_state_on_form();
        }

        private void b_buy_Click(object sender, EventArgs e)
        {
            String result;
            this.l_status.Text = "Создание транзакции...";
            result = this._data_module.add_default_transaction(Convert.ToInt32(this._work.work_id), DateTime.Now.ToString("MM.dd.yyyy"), "0.00", "0.00");
            if (result == "OK")
            {
                this.set_state("OLD");
                String trans_id = this._data_module.get_last_identity();
                form_transaction transaction = new form_transaction(this._data_module, Convert.ToInt32(trans_id));
                transaction.ShowDialog();
                this.update_work_state_on_form();
            }
            else
            {
                MessageBox.Show("Ошибка при создании транзакции по-умолчанию");
            }
        }

        private void b_save_MouseHover(object sender, EventArgs e)
        {
            this.hint.Show("Cохранение в базе данных\n внесенных изменений \nинформации о картине", this.b_save);
        }

        private void b_sale_MouseEnter(object sender, EventArgs e)
        {
            this.hint.Show("Приобрести работу в галерею.\nВызывает преход к оформлению покупки.", this.b_sale);
        }

        private void b_buy_MouseEnter(object sender, EventArgs e)
        {
            this.hint.Show("Продать работу клиенту.\nВызывает переход к оформлению продажи картины", this.b_buy);
        }

        private void b_delete_MouseEnter(object sender, EventArgs e)
        {
            this.hint.Show("Удалить запись о копии работы из базы данных.\nВызывает каскадное удаление соответствующих сделок.", this.b_delete);
        }
    }
}
